import { defineStore } from "pinia";
import { computed, ref } from "vue";

const indexDBStore = defineStore('indexDBStore', () => {

    const db = ref()

    /**
     * 判断数据库是否加载完成
     */
    const isOpenDB = computed(() => {
        if(db.value) return true
        return false
    })

    //============================================================================================================
    //数据库初始化链接
    //============================================================================================================
    const request = indexedDB.open("background", 1);
    request.onerror = function (event) {
        console.error("indexDB连接失败: " + event.target.errorCode);
    };
    request.onsuccess = function (event) {
        db.value = event.target.result;
    };
    request.onupgradeneeded = function (event) {
        db.value = event.target.result;
        // 创建一个对象存储空间来存储图片数据
        if (!db.value.objectStoreNames.contains('images')) {
            db.value.createObjectStore('images', { keyPath: 'id' }); // 'id' 是每个图片记录的唯一标识符
        }
    };
    //============================================================================================================
    //数据库初始化链接结束
    //============================================================================================================

    /**
     * 获取对象空间全部数据
     * @param {String} spaceKey 对象空间名
     * @param {Function} success 处理成功时回调的方法
     * @param {Function} error 处理失败时回调的方法
     */
    function getList(spaceKey, success = (res) => { }, error = () => { }) {
        if(!db.value) throw new Error('indexDB链接未加载完成')
        const transaction = db.value.transaction([spaceKey], 'readonly');
        const store = transaction.objectStore(spaceKey);
        const request = store.getAll();
        request.onsuccess = function() {
            success(request.result)
        }
        request.onerror = function() {
            error()
        }
    }

    /**
     * 获取对象空间对应id数据
     * @param {String} spaceKey 对象空间名
     * @param {String|Number} id 对象id
     * @param {Function} success 处理成功时回调的方法
     * @param {Function} error 处理失败时回调的方法
     */
    function get(spaceKey, id, success = (res) => { }, error = () => { }) {
        if(!db.value) throw new Error('indexDB链接未加载完成')
        const transaction = db.value.transaction([spaceKey], 'readonly');
        const store = transaction.objectStore(spaceKey);
        const request = store.get(id);
        request.onsuccess = function() {
            success(request.result)
        }
        request.onerror = function() {
            error()
        }
    }

    /**
     * 添加数据到对象空间
     * @param {String} spaceKey 对象空间名
     * @param {Object} data 存储的数据
     * @param {Function} success 处理成功时回调的方法
     * @param {Function} error 处理失败时回调的方法
     */
    function add(spaceKey, data, success = () => { }, error = () => { }) {
        if(!db.value) throw new Error('indexDB链接未加载完成')
        const transaction = db.value.transaction([spaceKey], 'readwrite');
        const store = transaction.objectStore(spaceKey);
        const request = store.add(data);
        request.onsuccess = function() {
            success()
        }
        request.onerror = function() {
            error()
        }
    }

    /**
     * 删除对象空间中的某条数据
     * @param {String} spaceKey 对象空间名
     * @param {id} id 存储的数据的id
     * @param {Function} success 处理成功时回调的方法
     * @param {Function} error 处理失败时回调的方法
     */
    function del(spaceKey, id, success = () => { }, error = () => { }) {
        if(!db.value) throw new Error('indexDB链接未加载完成')
        const transaction = db.value.transaction([spaceKey], 'readwrite');
        const store = transaction.objectStore(spaceKey);
        const request = store.delete(id);
        request.onsuccess = function() {
            success()
        }
        request.onerror = function() {
            error()
        }
    }

    return { isOpenDB, getList, get, add, del }
})

export default indexDBStore